﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Dziennik_ProfilNauczyciela.Wystawianie_ocen {


    public partial class WystawOceneKoncowaCalejKlasie : Form {
        int idKlasy;
        int idPrzedmiotu;
        public WystawOceneKoncowaCalejKlasie(int idKlasy, int idPrzedmiotu) {
            this.idKlasy = idKlasy;
            this.idPrzedmiotu = idPrzedmiotu;
            InitializeComponent();
            string przedmiot = (from p in SQLInterface.linqDataContext.przedmioties
                                where p.id == idPrzedmiotu
                                select p.nazwa).ToList().ElementAt(0);
            string klasa = (from k in SQLInterface.linqDataContext.klasies
                            where k.id == idKlasy
                            select ((k.semestr + 1) / 2).ToString() + k.nazwa).ToList().ElementAt(0);
            label1.Text = przedmiot + ", klasa " + klasa;
            
            WypelnijListeUczniow();
        }

        public void WypelnijListeUczniow() {
            List<Uczen> listaUczniow = new List<Uczen>();
            var uczniowieOceny = (from u in SQLInterface.linqDataContext.uczniowies
                                  join p in SQLInterface.linqDataContext.przedmioties on u.idKlasy equals p.idKlasy
                                  join o in SQLInterface.linqDataContext.ocenies on u.userId equals o.userIdUcznia into uo
                                  from o in uo.DefaultIfEmpty()
                                  where u.idKlasy == idKlasy && p.id == idPrzedmiotu
                                  select new {
                                      uid = u.userId,
                                      nazwiskoImie = u.nazwisko + " " + u.imie,
                                      srednia = (double?)((uo.Sum(x => x.ocena) == null || uo.Sum(x => x.ocena) == 0) ? (double?)null : (double?)(uo.Sum(x => x.ocena) / uo.Sum(x => x.waga))),                                      
                                  })
                                  .OrderBy(x => x.nazwiskoImie)
                                  .Distinct();
            int i = 1; 
            foreach (var a in uczniowieOceny) {
                string numer = " " + i.ToString() + " ";
                string srednia = (string)((a.srednia == null || a.srednia == 0) ? "" : ((double)a.srednia).ToString("F2"));
                string nazwiskoImie = (string)(a.nazwiskoImie);
                int uid = (int)a.uid;
                listaUczniow.Add(new Uczen(uid,numer,nazwiskoImie,srednia));
                i++;
            }
            dataGridView1.DataSource = listaUczniow;
        }
        public bool poprawnaOcena(string ocena) {
            if (ocena == null || ocena.Length == 0) return false;
            else if (ocena.Length == 1) {
                if (ocena[0] == '1' ||
                    ocena[0] == '2' ||
                    ocena[0] == '3' ||
                    ocena[0] == '4' ||
                    ocena[0] == '5' ||
                    ocena[0] == '6') return true;
                else return false;
            }
            else return false;
        }
        public bool WystawOceny() {            
            SqlTransaction tran = SQLInterface.conn.BeginTransaction(IsolationLevel.Serializable);

            if (rb_ADONET.Checked){
                SqlCommand cmd = SQLInterface.conn.CreateCommand();
                cmd.Connection = SQLInterface.conn;
                cmd.Transaction = tran;
                cmd.CommandText = ("execute dziennik.dbo.wystawOceneKoncowa @ocena, @userIdUcznia, @idPrzedmiotu");
                SqlParameter param_ocena = new SqlParameter("@ocena", null);
                SqlParameter param_userIdUcznia = new SqlParameter("@userIdUcznia", null);
                SqlParameter param_idPrzedmiotu = new SqlParameter("@idPrzedmiotu", idPrzedmiotu);
                cmd.Parameters.AddRange(new SqlParameter[]{param_idPrzedmiotu, param_ocena, param_userIdUcznia});
                try {
                    foreach (Uczen u in (List<Uczen>)dataGridView1.DataSource) {
                        param_ocena.Value = Convert.ToInt32(u.ocena);                        
                        param_userIdUcznia.Value = Convert.ToInt32(u.userId);
                        cmd.ExecuteNonQuery();
                    }
                    tran.Commit();
                }
                catch (Exception ex) {
                    tran.Rollback();
                    string blad = "Błąd transakcji - oceny nie zostały wystawione\n\n" + ex.Message;
                    MessageBox.Show(blad, "Błąd transakcji");
                    return false;
                }
                return true;
            }
            else {
                SQLInterface.linqDataContext.Transaction = tran;
                try {
                    foreach (Uczen u in (List<Uczen>)dataGridView1.DataSource) {
                        SQLInterface.linqDataContext.wystawOceneKoncowa(
                            Convert.ToInt32(u.ocena),
                            Convert.ToInt32(u.userId),
                            idPrzedmiotu);
                    }
                    tran.Commit();
                }
                catch (Exception ex) {
                    tran.Rollback();
                    string blad = "Błąd transakcji - oceny nie zostały wystawione\n\n" + ex.Message;
                    MessageBox.Show(blad, "Błąd transakcji");
                    return false;
                }
                return true;
            }
        }

        private void btn_Wystaw_Click(object sender, EventArgs e) {
            if (WystawOceny()) Close();
        }

    }

    public class Uczen {
        public int userId { get; set; }
        public string nr { get; set; }
        public string nazwiskoImie { get; set; }
        public string srednia { get; set; }
        public string ocena { get; set; }
        public Uczen(int userId, string nr, string nazwiskoImie, string srednia) {
            this.userId = userId;
            this.nr = nr;
            this.nazwiskoImie = nazwiskoImie;
            this.srednia = srednia;
            this.ocena = "";
        }
    }
}
